#include "playscene.h"
#include <QMenuBar>
#include <QMenu>
#include <QPainter>
#include <mypushbutton.h>
#include <QTimer>
#include <QLabel>
#include <QFont>
#include <mycoin.h>
#include <dataconfig.h>
#include <QPropertyAnimation>
#include <QDebug>
#include <QSound>

//PlayScene::PlayScene(QWidget *parent) : QMainWindow(parent)
//{

//}
PlayScene::PlayScene(int index){
    this->levalIndex=index;
    //设置窗口固定大小
    this->setFixedSize(320,588);
    //设置图标
    this->setWindowIcon(QPixmap(":/res/Coin0001.png"));
    //设置标题
    this->setWindowTitle("翻金币");

    //创建菜单栏
    QMenuBar*bar=new QMenuBar();
    this->setMenuBar(bar);
    //创建开始菜单
    QMenu*startMenu=bar->addMenu("开始");
    //创建按钮菜单项
    QAction*quitAction=startMenu->addAction("退出");
    //点击退出 退出游戏
    connect(quitAction,&QAction::triggered,[=](){
        this->close();
    });

    //返回按钮音效
    QSound*backSound=new QSound(":/res/BackButtonSound.wav",this);
    //翻金币音效
    QSound*flipSound=new QSound(":/res/ConFlipSound.wav",this);
    //胜利按钮音效
    QSound*winSound=new QSound(":/res/LevelWinSound.wav",this);


    //返回按钮
    MyPushButton*closeBtn=new MyPushButton(":/res/BackButton.png",":/res/BackButtonSelected.png");
    closeBtn->setParent(this);
    closeBtn->move(this->width()-closeBtn->width(),this->height()-closeBtn->height());

    //返回按钮功能实现
    connect(closeBtn,&MyPushButton::clicked,[=](){
        backSound->play();

        QTimer::singleShot(500,this,[=](){
            this->hide();
            //触发自定义信号，关闭自身，该信号写到signals下做声明
            emit this->chooseSceneBack();
        });
    });


    //显示当前关卡
    QLabel*label=new QLabel;
    label->setParent(this);
    QFont font;
    font.setFamily("华文新魏");
    font.setPointSize(20);
    label->setFont(font);
    QString str=QString("Leavel:%1").arg(this->levalIndex);
    label->setText(str);
    //设置大小和位置
    label->setGeometry(QRect(30,this->height()-50,120,50));

    dataConfig config;
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            gameArray[i][j]=config.mData[this->levalIndex][i][j];
        }
    }

    //胜利图片显示
    QLabel*winLabel=new QLabel;
    QPixmap winPix;
    winPix.load(":/res/LevelCompletedDialogBg.png");
    winLabel->setGeometry(0,0,winPix.width(),winPix.height());
    winLabel->setPixmap(winPix);
    winLabel->setParent(this);
    winLabel->move((this->width()-winPix.width())*0.5,-winPix.height());

    //创建金币的背景图片
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            //绘制背景图片
            QLabel*label=new QLabel;
            label->setGeometry(0,0,50,50);
            label->setPixmap(QPixmap(":/res/BoardNode(1).png"));
            label->setParent(this);
            label->move(57+i*50,200+j*50);

            //金币对象
            QString img;
            if(gameArray[i][j]==1){
                img=":/res/Coin0001.png";
            }else{
                img=":/res/Coin0008.png";
            }

            MyCoin*coin=new MyCoin(img);
            coin->setParent(this);
            coin->move(59+i*50,204+j*50);

            //记录x坐标
            coin->posX=i;
            //记录y坐标
            coin->posY=j;
            //记录正反标志
            coin->flag=gameArray[i][j];

            coinBtn[i][j]=coin;
            connect(coin,&MyCoin::clicked,[=](){
                //音效
                flipSound->play();
                //禁用按钮
                for(int i=0;i<4;i++){
                    for(int j=0;j<4;j++){
                        this->coinBtn[i][j]->isWin=true;
                    }
                }
                coin->changeFlag();
                //数组内部记录的标志同步修改
                gameArray[i][j]=gameArray[i][j]==0?1:0;

                //延时翻动其他周围金币
                QTimer::singleShot(300,this,[=](){
                    if(coin->posX+1<=3){
                        coinBtn[coin->posX+1][coin->posY]->changeFlag();
                        gameArray[coin->posX+1][coin->posY]=gameArray[coin->posX+1][coin->posY]==0?1:0;
                    }
                    if(coin->posX-1>=0){
                        coinBtn[coin->posX-1][coin->posY]->changeFlag();
                        gameArray[coin->posX-1][coin->posY]=gameArray[coin->posX-1][coin->posY]==0?1:0;
                    }
                    if(coin->posY+1<=3){
                        coinBtn[coin->posX][coin->posY+1]->changeFlag();
                        gameArray[coin->posX][coin->posY+1]=gameArray[coin->posX+1][coin->posY]==0?1:0;
                    }
                    if(coin->posY-1>=0){
                        coinBtn[coin->posX][coin->posY-1]->changeFlag();
                        gameArray[coin->posX][coin->posY-1]=gameArray[coin->posX+1][coin->posY]==0?1:0;
                    }

                    for(int i=0;i<4;i++){
                        for(int j=0;j<4;j++){
                            this->coinBtn[i][j]->isWin=false;
                        }
                    }

                    //判断是否胜利
                    this->isWin=true;
                    for(int i=0;i<4;i++){
                        for(int j=0;j<4;j++){
                            if(coinBtn[i][j]->flag==false){
                                this->isWin=false;
                                break;
                            }
                        }
                    }

                    if(this->isWin){
                        //音效
                        winSound->play();

                        qDebug()<<"胜利";

                        for(int i=0;i<4;i++){
                            for(int j=0;j<4;j++){
                                coinBtn[i][j]->isWin=true;
                            }
                        }

                        QPropertyAnimation*animation=new QPropertyAnimation(winLabel,"geometry");
                        animation->setDuration(1000);
                        animation->setStartValue(QRect(winLabel->x(),winLabel->y(),winLabel->width(),winLabel->height()));
                        animation->setEndValue(QRect(winLabel->x(),winLabel->y()+114,winLabel->width(),winLabel->height()));
                        animation->setEasingCurve(QEasingCurve::OutBounce);
                        animation->start();
                    }
                });
            });
        }
    }


}

void PlayScene::paintEvent(QPaintEvent *){
    //加载背景
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/res/PlayLevelSceneBg.png");
    painter.drawPixmap(0,0,pix.width(),pix.height(),pix);

    //加载标题
    pix.load(":/res/Title.png");
    pix=pix.scaled(pix.width()*0.5,pix.height()*0.5);
    painter.drawPixmap(10,30,pix.width(),pix.height(),pix);
}

